var SIGN_REGEXP = /([yMdhsm])(\1*)/g
var DEFAULT_PATTERN = 'yyyy-MM-dd'

function padding(s, len) {
  var len = len - (s + '').length
  for (var i = 0; i < len; i++) {
    s = '0' + s
  }
  return s
}

/**
 * 对象是否为空
 * @param obj 判断对象
 * @return true/false
 */
export const hasProp = (obj) => {
  let hasProp = false

  if (obj != undefined && obj != null) {
    for (var prop in obj) {
      hasProp = true
      break
    }
  }
  return hasProp
}

/**
 * 合并对象
 * @param  {...[type]} params [description]
 * @return {[type]}           [description]
 */
export const merge = (...params) => {
  let obj = {}
  if (params != null && params.length > 0) {
    for (let i = 0; i < params.length; i++) {
      Object.assign(obj, params[i])
    }
  }
  return obj
}

/**
 * 合并对象中相同键的值为一个对象
 */
export const mergeKey = (key, target, objs) => {
  if (key && objs) {
    target = target ? target : {}
    for (let i = 0; i < objs.length; i++) {
      target[key] = merge(target[key], objs[i][key])
    }
  }
  return target
}

/**
 * Vuex store对象合并
 */
export const mergeStore = (target, ...objs) => {
  const keys = ['state', 'getters', 'actions', 'mutations']
  for (let i = 0; i < keys.length; i++) {
    target = mergeKey(keys[i], target, objs)
  }
  return target
}

export default {
  getQueryStringByName: function (name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i")
    var r = window.location.search.substr(1).match(reg)
    var context = ""
    if (r != null)
      context = r[2]
    reg = null
    r = null
    return context == null || context == "" || context == "undefined" ? "" : context
  },

  formatDate: {
    format: function (date, pattern) {
      pattern = pattern || DEFAULT_PATTERN
      return pattern.replace(SIGN_REGEXP, function ($0) {
        switch ($0.charAt(0)) {
          case 'y':
            return padding(date.getFullYear(), $0.length)
          case 'M':
            return padding(date.getMonth() + 1, $0.length)
          case 'd':
            return padding(date.getDate(), $0.length)
          case 'w':
            return date.getDay() + 1
          case 'h':
            return padding(date.getHours(), $0.length)
          case 'm':
            return padding(date.getMinutes(), $0.length)
          case 's':
            return padding(date.getSeconds(), $0.length)
        }
      })
    },
    parse: function (dateString, pattern) {
      var matchs1 = pattern.match(SIGN_REGEXP)
      var matchs2 = dateString.match(/(\d)+/g)
      if (matchs1.length == matchs2.length) {
        var _date = new Date(1970, 0, 1)
        for (var i = 0; i < matchs1.length; i++) {
          var _int = parseInt(matchs2[i])
          var sign = matchs1[i]
          switch (sign.charAt(0)) {
            case 'y':
              _date.setFullYear(_int)
              break
            case 'M':
              _date.setMonth(_int - 1)
              break
            case 'd':
              _date.setDate(_int)
              break
            case 'h':
              _date.setHours(_int)
              break
            case 'm':
              _date.setMinutes(_int)
              break
            case 's':
              _date.setSeconds(_int);
              break
          }
        }
        return _date
      }
      return null
    },
  },

}